package cn.zhfeat.core.base.interfaces;

import java.io.Serializable;
import java.util.List;

import cn.zhfeat.core.base.BaseDto;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;

/**
 * @description: 基本Service接口实现
 * 
 * @param <E> 对应的实体类
 * @param <D> 对应的DTO
 * @param <PK> primary key，即数据库自增ID
 * 
 * @author ZhangHao
 * @date 2018年4月26日 上午11:51:57 
 * @version 1.0.0.1
 */
public interface IBaseService<E, D extends BaseDto, PK extends Serializable> {

	/**
	 * @descriptions 保存单一对象，如果实体中的某个字段为null则不保存这个字段 这种保存方法更加灵活。
	 * 
	 * @param entity
	 * @date 2016年5月19日下午3:20:23
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer insertSelective(E entity);

	/**
	 * @descriptions 保存单一对象，并返回这条记录的生成自增id
	 * 
	 * @param entity
	 * @date 2016年5月19日下午3:24:06
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer insertGotEntityId(E entity);

	/**
	 * @descriptions 保存单一对象，并返回这条记录生成的uuid
	 * 
	 * @param entity
	 * @date 2016年5月19日下午3:26:47
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer insertGotEntityUuid(E entity);

	/**
	 * @descriptions 批量添加操作，保存一个对象集合
	 * 
	 * @param list
	 * @date 2016年5月19日下午3:28:51
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer batchInsert(List<E> list);

	/**
	 * @descriptions 更新对象,如果属性中的主键(id)为空，则不会进行对应的属性值更新。
	 *               如果实体中的某个字段为null则不更新这个字段。这种更新方法更加灵活。
	 * 
	 * @param entity
	 * @date 2016年5月19日下午3:33:22
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer updateSelective(E entity);

	/**
	 * @descriptions 批量更新操作。 注意！此方法需要你自己在*****Mapper.xml 文件中写批量更新脚本
	 * 
	 * @param list
	 * @date 2016年5月19日下午3:37:07
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer batchUpdate(List<E> list);

	/**
	 * @descriptions 根据id删除对象
	 * 
	 * @param id
	 * @date 2016年5月19日下午3:41:49
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer deleteById(PK id);

	/**
	 * @descriptions 根据id list 删除对象集合|删除多条记录 注意！此方法需要你自己在*****Mapper.xml
	 *               文件中写批量删除脚本
	 * 
	 * @param list
	 * @date 2016年5月19日下午3:42:23
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer batchDelete(List<PK> list);

	/**
	 * @descriptions 根据条件集合删除对象 注意！此方法需要你自己在*****Mapper.xml 文件中写批量删除脚本
	 * 
	 * @param dto 数据传输对象(Data Transfer Object) mybatis进行对象匹配的属性
	 * @date 2016年5月19日下午3:45:00
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public <DTO> void deleteByCondition(DTO dto);

	/**
	 * @descriptions 根据id进行对象查询
	 *
	 * @param id
	 * @date 2016年5月19日下午3:56:41
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public E find(PK id);
	
	/**
	 * @description: 多条件查询并返回实体信息
	 *
	 * @param dto
	 * @author ZhangHao
	 * @date 2018年5月4日 上午10:20:39 
	 * @version 1.0.0.1
	 */
	public E findByType(D dto);

	/**
	 * @descriptions 根据任意属性查询 注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
	 * 
	 * @param entity 包含查询条件的实体
	 * @date 2016年5月19日下午4:00:11
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public List<E> findListByEntity(E entity);

    /**
     * @description: dto作为查询条件
     *
     * @param dto
     * @author ZhangHao
     * @date 2018年5月2日 下午4:37:41 
     * @version 1.0.0.1
     */
    public List<E> findListByDto(D dto);
    
	/**
	 * @descriptions 根据数据传输对象中的条件进行查询。此方法常用于分组查询：group by Dto
	 *               不同于Entity，但他们都是实体类。 注意！此方法需要你自己在*****Mapper.xml 文件中重写脚本
	 * 
	 * @param dto  数据传输对象(Data Transfer Object)
	 * @date 2016年5月19日下午4:10:52
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public <DTO> List<E> findGroupList(DTO dto);

	/**
	 * @descriptions 根据条件进行数量的查询 注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
	 * 
	 * @param dto  数据传输对象(Data Transfer Object) 
	 * @return 返回符合条件的泛型参数对应表中的数量
	 * @date 2016年5月19日下午4:18:57
	 * @author ZhangHao
	 * @version 1.0.0.1
	 * @param <DTO>
	 */
	public <DTO> int count(DTO dto);

	/**
	 * @descriptions 根据任意属性进行模糊查询 注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
	 * @param entity
	 * @date 2016年5月19日下午4:23:24
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public List<E> like(E entity);

	/**
	 * @descriptions 查询实体对应表最大Id.该方法只有在主键为int时才有用 注意！此方法 可能
	 *               需要你自己在*****Mapper.xml 文件中重写查询条件
	 * 
	 * @exception/throws 如果主键类型不为int，会抛出类型转换异常
	 * @return 返回泛型参数对应表的主键最大值
	 * @date 2016年5月19日下午4:24:36
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
	public Integer selectMaxId();

	/**
	 * @descriptions 封装findList()方法，根据条件查询一个集合，并将该集合转换成Json对象返回
	 * 
	 * @param entity
	 * @author ZhangHao
	 * @date 2016年6月10日-下午9:26:39
	 * @version 1.0.0.1
	 */
	public JSONObject jsonList(E entity);
	
	/**
	 * @description: 单纯返回分页对象
	 *
	 * @param dto
	 * @author ZhangHao
	 * @date 2018年4月27日 下午7:00:50 
	 * @version 1.0.0.1
	 */
	public PageInfo<E> pageList(D dto);

	
}
























